#include "test.h"
#include<time.h>
#include <limits.h>

static int fun(int x)
{
    if(x==1||x==2)
        return 1;
    else if(x==0)
        return 0;
    x= fun(x-1) + fun(x-2);
    return x;
}

static int clock_test()
{
    clock_t start_t,finish_t;
    double total_t = 0;
    int i = 0;
    start_t = clock();
    for(;i<100000;++i)
    {
        //do someting;
        fun(5);
    }
    finish_t = clock();
    total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;//将时间转换为秒

    printf("CPU 占用的总时间：%f\n", total_t);
    return 0;
}

int time_time_test()
{
  time_t seconds;

  seconds = time(NULL);
  printf("自 1970-01-01 起的小时数 = %d\n", (unsigned long)(seconds/3600));

  return(0);
}

int asctime_test()
{
   struct tm t;//更多情况下是通过localtime函数及gmtime函数获得tm结构

   t.tm_sec    = 10;
   t.tm_min    = 10;
   t.tm_hour   = 6;
   t.tm_mday   = 25;
   t.tm_mon    = 2;
   t.tm_year   = 89;
   t.tm_wday   = 6;

   printf("%s\n",asctime(&t));

   return(0);
}

int localtime_test ()
{
    time_t timer;
    struct tm *Now;

    time( &timer );

    Now = localtime( &timer );
    if (!Now) {
        return -1;
    }
    printf("当前的本地时间和日期：%s", asctime(Now));

    return(0);
}

int ctime_test ()
{
   time_t curtime;
   time(&curtime);
   printf("当前时间 = %s", ctime(&curtime));

   return(0);
}

int difftime_test()  
{  
    time_t first,second;  
    time(&first);  
    NX_ThreadSleep(2000);  
    time(&second);
    printf("The difference is: %f seconds",difftime(second,first));  

    return 0;
}

#define BST (+1)
#define CCT (+8)

int gmtime_test ()
{

   time_t rawtime;
   struct tm *info;

   time(&rawtime);
   /* 获取 GMT 时间 */
   info = gmtime(&rawtime );

   printf("当前的世界时钟：\n");
   printf("伦敦：%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
   printf("中国：%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);

   return(0);
}

int mktime_test ()
{
   int ret;
   struct tm info;
   char buffer[80];

   info.tm_year = 2001 - 1900;
   info.tm_mon = 7 - 1;
   info.tm_mday = 4;
   info.tm_hour = 0;
   info.tm_min = 0;
   info.tm_sec = 1;
   info.tm_isdst = -1;

   ret = mktime(&info);
   if( ret == -1 )
   {
       printf("错误：不能使用 mktime 转换时间。\n");
   }
   else
   {
      strftime(buffer, sizeof(buffer), "%c", &info );
      printf(buffer);
   }

   return(0);
}
/*format如下：它们是区分大小写的。
    %a 星期几的简写
    %A 星期几的全称
    %b 月分的简写
    %B 月份的全称
    %c 标准的日期的时间串
    %C 年份的后两位数字
    %d 十进制表示的每月的第几天
    %D 月/天/年
    %e 在两字符域中，十进制表示的每月的第几天
    %F 年-月-日
    %g 年份的后两位数字，使用基于周的年
    %G 年分，使用基于周的年
    %h 简写的月份名
    %H 24小时制的小时
    %I 12小时制的小时
    %j 十进制表示的每年的第几天
    %m 十进制表示的月份
    %M 十时制表示的分钟数
    %n 新行符
    %p 本地的AM或PM的等价显示
    %r 12小时的时间
    %R 显示小时和分钟：hh:mm
    %S 十进制的秒数
    %t 水平制表符
    %T 显示时分秒：hh:mm:ss
    %u 每周的第几天，星期一为第一天 （值从0到6，星期一为0）
    %U 第年的第几周，把星期日做为第一天（值从0到53）
    %V 每年的第几周，使用基于周的年
    %w 十进制表示的星期几（值从0到6，星期天为0）
    %W 每年的第几周，把星期一做为第一天（值从0到53）
    %x 标准的日期串
    %X 标准的时间串
    %y 不带世纪的十进制年份（值从0到99）
    %Y 带世纪部分的十进制年份
    %z，%Z 时区名称，如果不能得到时区名称则返回空字符。
    %% 百分号
*/  

int strftime_test ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];

   time( &rawtime );

   info = localtime( &rawtime );

   strftime(buffer,80,"%Y%m%e_%H%M%S", info);//以年月日_时分秒的形式表示当前时间
   printf("%s\n", buffer );

   return(0);
}

int timespec_get_test(void)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char buff[100];
    strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));
    printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);
    return 0;
}

int time_test(int argc, char *argv[])
{
    clock_test();
    time_time_test();
    asctime_test();
    localtime_test();
    ctime_test();
    difftime_test();
    gmtime_test();
    mktime_test();
    strftime_test();
    timespec_get_test();
    return 0;
}
